package com.test4.util;

import com.test4.bean.People;
import com.test4.bean.Tool;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Random;

/**
 * @author Cc
 * 2024-03-13
 */
public class ToolProxy implements InvocationHandler {
    public Tool target;

    public ToolProxy(Tool target) {
        this.target = target;
    }

    public static Tool createProxy(People people) {
        /*
          java.lang.reflact.Proxy类：提供了为对象产生代理对象的方法
          public static Object newProxyInstance(ClassLoader loader, Class<?>[] interface,InvocationHandler h)
          参数一：用于指定用哪个类加载器，去加载生成的代理类
          参数二：指定接口，这些接口用于指定生成的代理长什么，也就是有哪些方法
          参数三：用来指定生成的代理对象要干什么事情
         */

        Tool tool = (Tool) Proxy.newProxyInstance(
                ToolProxy.class.getClassLoader(),//参数一：用于指定用哪个类加载器，去加载生成的代理类
                new Class[]{Tool.class},//参数二：指定接口，这些接口用于指定生成的代理长什么，也就是有哪些方法

                //参数三：用来指定生成的代理对象要干什么事情
                (proxy, method, args) -> {
                    System.out.println(people.getClass().getName() + "正在使用" + people.getToolName() + "开门");

                    Random r = new Random();
                    int p = r.nextInt();
                    if (p % 2 == 0) {
                        System.out.println("感觉能开");
                        try {
                            return method.invoke(people, args);
                        } catch (InvocationTargetException e) {
                            System.err.println(e.getCause().getMessage());
                            return null;
                        }
                    } else {
                        System.out.println(people.getToolName() + "坏掉了");
                        return null;
                    }
                }
        );
        return tool;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(People.class.getName() + "正在使用" + target.getToolName() + "开门");

        Random r = new Random();
        int p = r.nextInt();
        if (p % 2 == 0)
            System.out.println("感觉能开");
        else
            System.out.println(target.getToolName() + "坏掉了");

        return method.invoke(target, args);
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }
}
